package net.bingosoft.common.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式常用操作Helper类,此处使用jdk1.4所带的正则表达式包
 * @author elvis
 */
public final class RegexHelper {
    private static final RegexHelper regexHelper = new RegexHelper();
    
    /**
     * Constructor
     */
    protected RegexHelper(){}

    /**
     * 返回RegexHelper的实例
     * @return RegexHelper 
     */
    public static RegexHelper getInstance(){
        return regexHelper;
    }
    
    /**
     * 判断指定的字符串是否符合某个正则表达式
     * @param content 字符串
     * @param regex 正则表达式
     * @param caseSentivite 是否大小写敏感，true区分大小写，false不区分
     * @return 符合返回true，否则返回false
     */
    public boolean isMatchString(String content,String regex,boolean caseSentivite){
        boolean result = false;
        if(null == content || null == regex){
            throw new NullPointerException("error,content or regex is null");
        }        

        Pattern pattern = null;
        if(!caseSentivite){
        	pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
        }else{
        	pattern = Pattern.compile(regex);
        }
        
        Matcher matcher = pattern.matcher(content);
        result = matcher.matches();
        
        return result;
    }
        
    
    /**
     * 判断指定的字符串是否符合某个正则表达式，大小写敏感
     * @param content 字符串
     * @param regex 正则表达式
     * @return 符合返回true，否则返回false
     */
    public boolean isMatchString(String content,String regex){
    	return isMatchString(content,regex,true);
    }
    
    /**
     * 根据传入的正则表达式对字符串进行匹配查询，并返回第一个匹配结果
     * @param content 需要查询的字符串
     * @param regex 正则表达式
     * @return 存在匹配返回第一个匹配结果，否则返回null
     */
    public String getFirstMatchString(String content,String regex){
        if(null == content || null == regex){
            throw new NullPointerException("error,content or regex is null");
        }
        
        String result = null;
        
        Pattern pattern = Pattern.compile(regex,Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(content);
        if(matcher.lookingAt()){
            result = matcher.group(1);
        }
        
        return result;
    }
    
    /**
     * 替换符合正则表达式的内容为新的值
     * @param content
     * @param regex
     * @param newValue
     * @return
     */
    public String replaceAllMatchString(String content,String regex,String newValue){
        String replace = getFirstMatchString(content,regex);
        if(null != replace){
            return content.replaceAll(replace,newValue);
        }
        return content;
    }
    
    /**
     * 根据传入的正则表达式对字符串进行匹配查询，并以数组形式返回所有匹配结果。
     * @param content 字符串
     * @param regex 正则表达式
     * @return 以list方式返回所有匹配结果
     */
    public List getMatchResultList(String content,String regex){
        if(null == content || null == regex){
            throw new NullPointerException("error,content or regex is null");
        }
        ArrayList<String> arrList = new ArrayList<String>();
        Pattern pattern = Pattern.compile(regex,Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(content);
        if(matcher.lookingAt()){
            for(int i = 1; i <= matcher.groupCount(); i++){
                arrList.add(matcher.group(i));
            }
        }
        return arrList;
    }    
}
